﻿using ALMDDD.AspNetCore.Common;
using Microsoft.Extensions.Configuration;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ALMDDD.AspNetCore.Redis
{
    //参考链接：http://msdn.microsoft.com/zh-cn/library/azure/dn690521.aspx
    //ConnectionMultiplexer 旨在通过客户端应用程序共享和重新使用，而不需要根据每一步操作创建。
    //如果您每次调用缓存时就创建实例并连接，则性能会降低。此外，Azure Redis Cache 最多可连接到 10,000 个客户端。
    //如果迅速连接很多 ConnectionMultiplexer 示例，将可以达到限制。
    //共享应用程序中的 ConnectionMultiplexer 实例的一个方法是，拥有返回连接示例的静态属性（与下列示例类似）。
    //这种线程安全方法，可仅初始化单一连接的 ConnectionMultiplexer 实例。
    //ConnectionMultiplexer 的一个关键功能是，一旦还原网络问题和其他原因，它将自动还原缓存连接。

    public class ConMultiplexerHelper
    {
       
        private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
        {

            string strRedisConfig = NetCoreHelper.GetConnectionString("RedisConnection");
            return ConnectionMultiplexer.Connect(strRedisConfig);
        });

        public static ConnectionMultiplexer Connection
        {
            get { return lazyConnection.Value; }
        }

        public static IServer GetServer(ConnectionMultiplexer muxer)
        {
            EndPoint[] endpoints = muxer.GetEndPoints();
            IServer result = null;
            foreach (var endpoint in endpoints)
            {
                var server = muxer.GetServer(endpoint);
                if (server.IsSlave || !server.IsConnected) continue;
                if (result != null)
                    throw new InvalidOperationException("Requires exactly one master endpoint (found " + server.EndPoint + " and " + result.EndPoint + ")");
                result = server;
            }
            if (result == null)
                throw new InvalidOperationException("Requires exactly one master endpoint (found none)");
            return result;
        }
    }
}
